package com.demo.factory01.abstractfactory.factory;

import com.demo.factory01.abstractfactory.product.Aircondition;
import com.demo.factory01.abstractfactory.product.Engine;

/**
 * 抽象工厂 AbstractFactory：定义了一个接口，这个接口包含了一组方法用来生产产品，所有的具体工厂都必须实现此接口。
 * 具体工厂 ConcreteFactory：用于生产不同产品族，要创建一个产品，用户只需使用其中一个工厂进行获取，完全不需要实例化任何产品对象。
 * 抽象产品 AbstractProduct：这是一个产品家族，每一个具体工厂都能够生产一整组产品。
 * 具体产品 Product

 通过抽象工厂模式，我们可以实现以下的效果：比如宝马320系列使用空调型号A和发动机型号A，而宝马230系列
 使用空调型号B和发动机型号B，在为320系列生产相关配件时，就无需制定配件的型号，它会自动根据车型生产对
 应的配件型号A。

 也就是说，当每个抽象产品都有多于一个的具体子类的时候（空调有型号A和B两种，发动机也有型号A和B两种），
 工厂角色怎么知道实例化哪一个子类呢？抽象工厂模式提供两个具体工厂角色（宝马320系列工厂和宝马230系列工厂），
 分别对应于这两个具体产品角色，每一个具体工厂角色只负责某一个产品角色的实例化，每一个具体工厂类只负责
 创建抽象产品的某一个具体子类的实例。


 工厂模式小结：

 1、工厂方法模式与抽象工厂模式的区别在于：

 （1）工厂方法只有一个抽象产品类和一个抽象工厂类，但可以派生出多个具体产品类和具体工厂类，
 每个具体工厂类只能创建一个具体产品类的实例。

 （2）抽象工厂模式拥有多个抽象产品类（产品族）和一个抽象工厂类，每个抽象产品类可以派生出多
 个具体产品类；抽象工厂类也可以派生出多个具体工厂类，同时每个具体工厂类可以创建多个具体
 产品类的实例

 */
//创建工厂的接口
public interface AbstractFactory {  
    //制造发动机
    Engine createEngine();
    //制造空调 
    Aircondition createAircondition();
}  
